﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using IniParser;
using System.Collections;

namespace ServerCSharp
{

    public partial class Form1 : Form
    {   
        //
        // Criação dos objetos "globais"
        // 
        private String portS;
        private Int16 port;
        private FileIniDataParser parser;
        private IniData iniDados;
        private MyServer myServer;      
        private ArrayList veiculos;

        private bool refresh;
        public delegate void Teste(String linha);
        public Teste myDelegate;
        
        //
        // Construtor
        //
        public Form1()
        {
            InitializeComponent(); // Inicialização normal dos componentes
            refresh = false;
            parser = new FileIniDataParser(); // Inicialização do objeto para futura leitura do arquivo .ini
            iniDados = parser.LoadFile("config.ini"); // Inicialização do objeto com os dados do arquivo.ini
            portS = iniDados["ServerConfig"]["port"]; // Atribuição do valor de porta contido no arquivo para a variavel interna
            port = Int16.Parse(portS); // Conversão do valor da porta para inteiro
            labelPortaAtual.Text = portS; // Exibição da porta na tela
            myServer = new MyServer(port);
        }

        public void TesteMethod(String text)
        {
            logTextBox.Text = text;
            logTextBox.Refresh();
        }
        
        private void buttonNewPortOK_Click(object sender, EventArgs e)
        {
            String portSTemp = textBoxPort.Text;
            if (portSTemp != portS)
            {
                portS = portSTemp;
                iniDados["ServerConfig"]["port"] = portSTemp;
                parser.SaveFile("config.ini", iniDados);
                MessageBox.Show("As alterações realizadas só terão efeito na \npróxima execução do programa.", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void textBoxPort_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                buttonNewPortOK_Click(this, e);
            }
        }
        
        private void StartRefreshingLog()
        {
            while (refresh)
            {
                String text = "";
                //int counter = 0;

                //logTextBox.Lines = new string[veiculos.Count];

                foreach (Veiculo v in veiculos)
                {
                    text += "ID = ";
                    text += v.ID.ToString();
                    text += " | ";
                    text += "Pos = ";
                    text += v.UltPosicao.ToString();
                    text += " | ";
                    text += "Status = ";
                    text += v.Estado.ToString();
                    text += "\r\n";
                    //logTextBox.Lines[counter] = linha;
                    // counter++;
                }

                Invoke(myDelegate, text);


                Thread.Sleep(500);
            }
        }

        private void refreshButton_Click(object sender, EventArgs e)
        {
            myDelegate = new Teste(TesteMethod);
            veiculos = myServer.VeiculosConectados;
            refresh = true;
            Thread refreshThread = new Thread(new ThreadStart(StartRefreshingLog));
            refreshThread.Start();
        }

        private void buttonEnviar_Click(object sender, EventArgs e)
        {
            Int32 id = Int32.Parse(idVeiculoTextBox.Text);
            Int32 dest = Int32.Parse(destinoTextBox.Text);

            try
            {
                myServer.AtualizarDestino(id, (Int16)dest);
            }
            catch (Exception)
            {
            }
        }

        private void buttonStopRefresh_Click(object sender, EventArgs e)
        {
            refresh = false;
        }

        
    }
}
